# Define installation path, rule name, and log file path
$InstallPath = "${env:ProgramFiles}\FileWave\client"
$RuleName = "FileWave Client 15.5+"
$LogFile = "$env:windir\Temp\FileWaveFirewallSetup.log"

# Function to log messages to both the console and log file
function Log-Message {
    param (
        [string]$Message
    )
    $Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $LogEntry = "$Timestamp - $Message"
    Write-Output $LogEntry
    Add-Content -Path $LogFile -Value $LogEntry
}

# Start of the script
Log-Message "Starting FileWave Client firewall rule configuration..."

# Function to add firewall rules
function Add-FirewallRule {
    Log-Message "Creating firewall rules for FileWave Client..."

    # Inbound rule
    Log-Message "Adding inbound rule..."
    netsh advfirewall firewall add rule `
        name=$RuleName `
        action=allow `
        program="$InstallPath\fwcld.exe" `
        enable=yes `
        dir=in `
        description="FileWave Client Inbound Access, usually only port 20010 is needed for client monitor connections" | Out-Null

    if ($?) {
        Log-Message "Inbound rule created successfully."
    } else {
        Log-Message "Error: Failed to create inbound rule."
    }

    # Outbound rule
    Log-Message "Adding outbound rule..."
    netsh advfirewall firewall add rule `
        name=$RuleName `
        action=allow `
        program="$InstallPath\fwcld.exe" `
        enable=yes `
        dir=out `
        description="FileWave Client outbound access, usually only ports 20015-20020 are needed for client monitor connections" | Out-Null

    if ($?) {
        Log-Message "Outbound rule created successfully."
    } else {
        Log-Message "Error: Failed to create outbound rule."
    }
}

# Check if OS is Windows 10 or newer
$OSVersion = [System.Environment]::OSVersion.Version
Log-Message "Detected OS Version: $OSVersion"

if ($OSVersion.Major -lt 10) {
    Log-Message "This script requires Windows 10 or newer. Exiting..."
    exit 1
} else {
    Log-Message "Confirmed Windows 10 or newer. Proceeding with firewall rule check..."

    # Check if firewall rule already exists
    Log-Message "Checking if firewall rule '$RuleName' already exists..."
    $RuleExists = netsh advfirewall firewall show rule name=$RuleName | Select-String -Pattern $RuleName -Quiet

    if ($RuleExists) {
        Log-Message "Firewall rules for FileWave Client already exist. Skipping rule creation."
    } else {
        Log-Message "No existing firewall rules found. Initiating rule creation..."
        Add-FirewallRule
    }
}

Log-Message "Firewall configuration script completed."
